import os

"""
获取文件所在的绝对地址：
    os.path.dirname(os.path.realpath(__file__))
"""

__all__ = [
    'short_name_for_path',  # 从文件地址中，获取短文件名（不含文件拓展名）
    'extension_for_path',  # 从文件地址中获取文件拓展名
    'listdir',  # 获取指定路径下文件（夹）列表
    'abspath',  # 返回绝对路径
    'basename',  # 返回文件名
    'commonprefix',  # 返回list(多个路径)中，所有path共有的最长的路径。
    'dirname',  # 返回文件路径
    'exists',  # 路径存在则返回True,路径损坏返回False
    'lexists',  # 路径存在则返回True,路径损坏也返回True
    'expanduser',  # 把path中包含的"~"和"~user"转换成用户目录
    'expandvars',  # 根据环境变量的值替换path中包含的”$name”和”${name}”
    'getatime',  # 返回最后一次进入此path的时间
    'getmtime',  # 返回在此path下最后一次修改的时间
    'getctime',  # 返回path 创建时间
    'getsize',  # 返回文件大小，如果文件不存在就返回错误
    'isabs',  # 判断是否为绝对路径
    'isfile',  # 判断路径是否为文件
    'isdir',  # 判断路径是否为目录
    'islink',  # 判断路径是否为链接
    'ismount',  # 判断路径是否为挂载点
    'join',  # 把目录和文件名合成一个路径
    'normcase',  # 转换path的大小写和斜杠
    'normpath',  # 规范path字符串形式
    'realpath',  # 返回path的真实路径
    'relpath',  # 从start开始计算相对路径
    'samefile',  # 判断目录或文件是否相同
    'sameopenfile',  # 判断fp1和fp2是否指向同一文件
    'samestat',  # 判断stat tuple stat1和stat2是否指向同一个文件
    'split',  # 把路径分割成dirname和basename，返回一个元组
    'splitdrive',  # 一般用在windows下，返回驱动器名和路径组成的元组
    'splitext',  # 分割路径，返回路径名和文件扩展名的元组
]


def short_name_for_path(path):
    """ 从文件地址中，获取短文件名（不含文件拓展名） """
    return os.path.splitext(os.path.basename(path))[0]


def extension_for_path(path):
    """ 从文件地址中获取 文件拓展名 """
    return os.path.splitext(path)[-1]


def listdir(path: str = None,
            extension: any = None,
            full_path: bool = False,
            hide: bool = False,
            folder: bool = False):
    """ 获取指定路径下文件（夹）列表

    :param path: str，文件夹地址，None,为当前路径。默认 None
    :param extension: str, list 指定拓展名，None为不限制拓展名。默认为None
    :param full_path: bool 是否处理成完整路径，False：不处理。默认为False
    :param hide: bool 是否返回隐藏文件。默认False，不返回
    :param folder: bool 是否返回文件夹。默认False，不返回
    :return: list 文件（夹）列表
    """
    files = os.listdir(path)
    files_new = []
    for n in files:
        if not hide and n.startswith("."):
            continue
        if extension:
            if isinstance(extension, str):
                extension = [extension]
            if not any(n.endswith(e) for e in extension):
                continue
        if not folder:
            if path:
                full_path_buff = os.path.join(path, n)
            else:
                full_path_buff = n
            if os.path.isdir(full_path_buff):
                continue
        if full_path and path:
            n = os.path.join(path, n)
        files_new.append(n)
    return files_new


def abspath(path):
    """ 返回绝对路径 """
    return os.path.abspath(path)


def basename(path):
    """ 返回文件名 """
    return os.path.basename(path)


def commonprefix(path_list):
    """ 返回list(多个路径)中，所有path共有的最长的路径。 """
    os.path.commonprefix(path_list)


def dirname(path):
    """ 返回文件路径 """
    return os.path.dirname(path)


def exists(path):
    """ 路径存在则返回True,路径损坏返回False """
    return os.path.exists(path)


def lexists(path):
    """ 路径存在则返回True,路径损坏也返回True """
    return os.path.lexists(path)


def expanduser(path):
    """ 把path中包含的"~"和"~user"转换成用户目录 """
    return os.path.expanduser(path)


def expandvars(path):
    """ 根据环境变量的值替换path中包含的”$name”和”${name}” """
    return os.path.expandvars(path)


def getatime(path):
    """ 返回最后一次进入此path的时间 """
    return os.path.getatime(path)


def getmtime(path):
    """ 返回在此path下最后一次修改的时间 """
    return os.path.getmtime(path)


def getctime(path):
    """ 返回path 创建时间 """
    return os.path.getctime(path)


def getsize(path):
    """ 返回文件大小，如果文件不存在就返回错误 """
    return os.path.getsize(path)


def isabs(path):
    """ 判断是否为绝对路径 """
    return os.path.isabs(path)


def isfile(path):
    """ 判断路径是否为文件 """
    return os.path.isfile(path)


def isdir(path):
    """ 判断路径是否为目录 """
    return os.path.isdir(path)


def islink(path):
    """ 判断路径是否为链接 """
    return os.path.islink(path)


def ismount(path):
    """" 判断路径是否为挂载点 """
    return os.path.ismount(path)


def join(*args, **kwargs):
    """ os.path.join(path1[, path2[, ...]]) #把目录和文件名合成一个路径 """
    return os.path.join(*args, **kwargs)


def normcase(path):
    """ 转换path的大小写和斜杠 """
    return os.path.normcase(path)


def normpath(path):
    """ 规范path字符串形式 """
    return os.path.normpath(path)


def realpath(path):
    """ 返回path的真实路径 """
    return os.path.realpath(path)


def relpath(*args, **kwargs):
    """ os.path.relpath(path[, start]) #从start开始计算相对路径 """
    return os.path.relpath(*args, **kwargs)


def samefile(path1, path2):
    """ 判断目录或文件是否相同 """
    return os.path.samefile(path1, path2)


def sameopenfile(fp1, fp2):
    """ 判断fp1和fp2是否指向同一文件 """
    return os.path.sameopenfile(fp1, fp2)


def samestat(stat1, stat2):
    """ 判断stat tuple stat1和stat2是否指向同一个文件 """
    return os.path.samestat(stat1, stat2)


def split(path):
    """ 把路径分割成dirname和basename，返回一个元组 """
    return os.path.split(path)


def splitdrive(path):
    """ 一般用在windows下，返回驱动器名和路径组成的元组 """
    return os.path.splitdrive(path)


def splitext(path):
    """ 分割路径，返回路径名和文件扩展名的元组 """
    return os.path.splitext(path)

